package com.ip.user.models.service;

import com.ip.user.models.bo.UserBO;
import com.ip.user.models.dto.ChangePasswordDTO;
import com.ip.user.models.dto.UserLoginDTO;
import com.ip.user.models.dto.UserRegisterDTO;
import com.ip.user.models.vo.SysLoginLogVO;
import com.ip.user.models.vo.UserVO;
import com.ip.common.constant.PageResult;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 系统用户服务接口
 */
public interface SysUserService {
    
    /**
     * 用户注册
     * @param userRegisterDTO 用户注册DTO对象
     * @return 注册的用户VO对象
     */
    UserVO registerUser(UserRegisterDTO userRegisterDTO);
    
    /**
     * 用户登录
     * @param userLoginDTO 用户登录DTO对象
     * @return 登录的用户VO对象
     */
    UserVO login(UserLoginDTO userLoginDTO);
    
    /**
     * 根据用户ID获取用户
     * @param userId 用户ID
     * @return 用户VO对象
     */
    UserVO getUserById(Integer userId);
    
    /**
     * 根据用户名获取用户
     * @param userName 用户名
     * @return 用户VO对象
     */
    UserVO getUserByUserName(String userName);
    
    /**
     * 根据身份证号获取用户
     * @param idCard 身份证号
     * @return 用户VO对象
     */
    UserVO getUserByIdCard(String idCard);
    
    /**
     * 根据邮箱获取用户
     * @param email 邮箱
     * @return 用户VO对象
     */
    UserVO getUserByEmail(String email);
    
    /**
     * 获取所有用户
     * @return 用户VO列表
     */
    List<UserVO> getAllUsers();
    
    /**
     * 更新用户信息
     * @param userBO 用户BO对象
     * @return 更新后的用户VO对象
     */
    UserVO updateUser(UserBO userBO);
    
    /**
     * 删除用户
     * @param userId 用户ID
     */
    void deleteUser(Integer userId);
    
    /**
     * 检查用户名是否存在
     * @param userName 用户名
     * @return 存在返回true，否则返回false
     */
    boolean existsByUserName(String userName);
    
    /**
     * 检查身份证号是否存在
     * @param idCard 身份证号
     * @return 存在返回true，否则返回false
     */
    boolean existsByIdCard(String idCard);
    
    /**
     * 修改密码
     * @param changePasswordDTO 修改密码DTO对象
     * @return 修改成功返回true，否则返回false
     */
    boolean changePassword(ChangePasswordDTO changePasswordDTO);
    
    /**
     * 通过邮箱重置密码为身份证号后六位
     * @param email 邮箱地址
     * @return 重置成功返回true，否则返回false
     */
    boolean resetPasswordByEmail(String email);
    
    /**
     * 查询所有登录日志（分页）
     * @param pageNo 页码
     * @param pageSize 每页大小
     * @return 分页结果
     */
    PageResult<List<SysLoginLogVO>> getAllLoginLogs(int pageNo, int pageSize);
    
    /**
     * 根据多个条件组合查询登录日志（分页）
     * @param startTime 开始时间（可选）
     * @param endTime 结束时间（可选）
     * @param loginStatus 登录状态（1=成功，0=失败，null表示不限制）
     * @param userName 用户名（可选）
     * @param pageNo 页码
     * @param pageSize 每页大小
     * @return 分页结果
     */
    PageResult<List<SysLoginLogVO>> getLoginLogsByConditions(LocalDateTime startTime, LocalDateTime endTime, Integer loginStatus, String userName, int pageNo, int pageSize);
}